package com.tanhua.mongo.api;

import com.tanhua.dubbo.api.UserLikeApi;
import com.tanhua.model.mongo.UserLike;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;
import java.util.stream.Collectors;

@DubboService
public class UserLikeApiImpl implements UserLikeApi {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 获取用户喜欢人
     *
     * @param page
     * @param pagesize
     * @param userId
     * @return
     */
    @Override
    public List<UserLike> findByUserId(int page, int pagesize, Long userId) {
        Query query = Query.query(Criteria.where("userId").is(userId))
                .skip((page - 1) * pagesize)
                .limit(pagesize)
                .with(Sort.by(Sort.Order.desc("created")));
        return mongoTemplate.find(query,UserLike.class);
    }

    /**
     * 添加喜欢或者不喜欢
     *
     * @param userId
     * @param likeId
     * @param isLike
     * @return
     */
    @Override
    public Boolean saveOrUpdate(Long userId, Long likeId, boolean isLike) {
        try {
            //查询当前用户与该用户是否有关联关系
            Query query = Query.query(Criteria.where("userId").is(userId)
                    .and("likeUserId").is(likeId));
            UserLike userLike = mongoTemplate.findOne(query,UserLike.class);
            if (userLike == null){
                //没有关系新增关系
                userLike = new UserLike();
                userLike.setUserId(userId);
                userLike.setLikeUserId(likeId);
                userLike.setIsLike(isLike);
                userLike.setCreated(System.currentTimeMillis());
                userLike.setUpdated(System.currentTimeMillis());
                mongoTemplate.save(userLike);
            }else {
                //有关系修改关系
                Update update = Update.update("isLike",isLike)
                        .set("updated",System.currentTimeMillis());
                mongoTemplate.updateFirst(query,update,UserLike.class);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取粉丝总数
     *
     * @param userId
     * @return
     */
    @Override
    public Integer countsFans(Long userId) {
        Query query = Query.query(Criteria.where("likeUserId").is(userId)
                .and("isLike").is(true));
        long count = mongoTemplate.count(query, UserLike.class);
        return Math.toIntExact(count);
    }

    /**
     * 获取相互喜欢的总数
     *
     * @param userId
     * @return
     */
    @Override
    public Integer countsEachLove(Long userId) {
        //获取当前用户的喜欢用户id
        Query query = Query.query(Criteria.where("userId").is(userId).and("isLike").is(true));
        List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);

        List<Long> ids = userLikeList.stream().map(item -> item.getLikeUserId()).collect(Collectors.toList());

        //判断喜欢的用户是否喜欢当前用户
        Query query1 = Query.query(Criteria.where("userId").in(ids).and("likeUserId").is(userId)
                .and("isLike").is(true));

        long count = mongoTemplate.count(query1, UserLike.class);

        return Math.toIntExact(count);
    }
}
